package com.xjve.framework.hibernate.jpa;

import lombok.Getter;
import lombok.Setter;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 所有查询对象的基类
 * @param <T> 实体类类型
 */
@Getter
@Setter
public abstract class BaseSearch<T> {
    @SearchIgnore
    private Integer curPage = 1;

    @SearchIgnore
    private Integer pageSize = 20;

    @SearchIgnore
    private Long allCount;

    /**
     * 获取实体类类型
     */
    protected abstract Class<T> getEntityClass();

    /**
     * 静态工厂方法，创建Search实例
     */
    public static <S extends BaseSearch<?>> S of(Class<S> searchClass) {
        try {
            return searchClass.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException("Failed to create search instance", e);
        }
    }

    /**
     * 执行查询，返回结果列表
     */
    public List<T> find() {
        return SearchExecutor.execute(this);
    }

    /**
     * 执行分页查询，返回分页结果
     */
    public Page<T> findPage() {
        return SearchExecutor.executePage(this);
    }

    /**
     * 执行统计查询，返回总数
     */
    public long count() {
        return SearchExecutor.count(this);
    }


}
